package com.proyecto.personas.modelo.test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;

import com.proyecto.core.Utilidades.ElementoMenu;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.core.modelo.servicio.interfaces.IServicioTransaccion;
import com.proyecto.seguridad.modelo.dao.SegOperacionesDAO;
import com.proyecto.seguridad.modelo.dto.SegOperaciones;

public class ServicioOperaciones extends ServicioGenerico {
	SegOperacionesDAO operDAO;

	public void EjecutarServicioSinValid(Object o, Integer servicio) throws GeneralException {
		
		boolean estadoanterior = this.isValidacionActiva();

		switch (servicio) {
		case ServicioGenerico.SERV_INCLUIR:
			this.incluir(o);
			break;
		case ServicioGenerico.SERV_MODIFICAR:
			this.modificar(o);
			break;
		case ServicioGenerico.SERV_ELIMINAR:
			this.eliminar(o);
			break;
		case ServicioGenerico.SERV_CONSULTAR:
			this.consultar(o);
			break;
		case ServicioGenerico.SERV_CONSULTARTODOS:
			this.consultarTodos(o);
			break;
		default:
			break;
		}
		setValidacionActiva(estadoanterior);
	}

	public boolean isValidacionActiva() {
		return true;
	}

	public void setValidacionActiva(boolean validacionActiva) {
		
	}
	
	public List buscarCatalogoPorPropiedad(String atributo, String valor)
			throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public Object consultar(Object o) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public List consultarTodos(Object o) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public Vector<ElementoMenu> consultarParaMenu() throws GeneralException {

		List<SegOperaciones> operacionesLista = new ArrayList<SegOperaciones>();
		operacionesLista = operDAO.findMenuElements();

		Stack<SegOperaciones> operaciones = new Stack<SegOperaciones>();
		operaciones.addAll(operacionesLista);

		Vector<ElementoMenu> vectorMenu = new Vector<ElementoMenu>();

		generaMenu(operaciones, vectorMenu, 1);

		return vectorMenu;
	}

	private void generaMenu(Stack<SegOperaciones> lista, Vector<ElementoMenu> vector, int nivel) 
	throws GeneralException {

		int nivelAux;
		Vector<ElementoMenu> vectorSubMenu = null;
		
		Class claseOperacion;
		Method nivelOperacion;
		

		try {
			claseOperacion = Class.forName("com.openLabs.seguridad.modelo.dto.SegOperaciones");
			nivelOperacion = claseOperacion.getMethod("getOperacionnivel" + String.valueOf(nivel), null);

			while (!lista.empty()) {
				SegOperaciones operacion = lista.peek();

				if ((Integer) nivelOperacion.invoke(operacion, null) != 0) {

					operacion = lista.pop();

					if ("B".equals(operacion.getOperacionmenutipo())) {

						vector.add(new ElementoMenu(operacion.getOperacionnombre(), ElementoMenu.BOTON, operacion.getOperacionobjeto()));
					} else if ("A".equals(operacion.getOperacionmenutipo())) {

						Vector<ElementoMenu> subMenu = new Vector<ElementoMenu>();

						vector.add(new ElementoMenu(operacion.getOperacionnombre(), ElementoMenu.MENU, subMenu));
						
						nivelAux = nivel + 1;
						generaMenu(lista, subMenu, nivelAux);
					}
				} else {
					break;
				}
			}

		} catch (ClassNotFoundException e) {
			throw new GeneralException("<CLAVE DE MENSAJE1>");
		} catch (NoSuchMethodException e) {
			throw new GeneralException("<CLAVE DE MENSAJE2>");
		} catch (IllegalArgumentException e) {
			throw new GeneralException("<CLAVE DE MENSAJE3>");
		} catch (IllegalAccessException e) {
			throw new GeneralException("<CLAVE DE MENSAJE4>");
		} catch (InvocationTargetException e) {
			throw new GeneralException("<CLAVE DE MENSAJE5>");
		}

	}

	public void eliminar(Object o) throws GeneralException {
		// TODO Auto-generated method stub

	}

	public void incluir(Object o) throws GeneralException {
		// TODO Auto-generated method stub

	}

	public void modificar(Object o) throws GeneralException {
		// TODO Auto-generated method stub

	}

	public Object obtenerDTOInicianlizado() throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public SegOperacionesDAO getOperDAO() {
		return operDAO;
	}

	public void setOperDAO(SegOperacionesDAO operDAO) {
		this.operDAO = operDAO;
	}

	public List buscarCatalogoPorPropiedadIgual(String[] atributo, String[] valor) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public List buscarCatalogoPorPropiedad(String[] atributo, String[] valor, int tipoBusqueda) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public List buscarCatalogoPorPropiedad(String[] atributo, Object[] valor, int tipoBusqueda,boolean ... aplicarUpper) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public Long buscarMaxCount(String[] atributo, Object[] valor, int tipoBusqueda) throws GeneralException {
		// TODO Auto-generated method stub
		return null;
	}

	public void incluir(Object o, boolean iniciaTransaccion)
			throws GeneralException {
		// TODO Auto-generated method stub
		
	}

	public void eliminar(Object o, boolean iniciaTransaccion)
			throws GeneralException {
		// TODO Auto-generated method stub
		
	}

	public void modificar(Object o, boolean iniciaTransaccion)
			throws GeneralException {
		// TODO Auto-generated method stub
		
	}

	public Integer ejecutarQueryDMLk(String query, boolean iniciaTransaccion) {
		// TODO Auto-generated method stub
		return 0; 
	}

}
